/**
 * @description 登录注册接口
 */

// 导入数据库
const db = require('../db/index.js')
// 导入加密中间件
const bcrypt = require('bcrypt')
// 导入jwt，用于生成token
const jwt = require('jsonwebtoken')
// 导入jwtconfig，用于加密和解密
const jwtconfig = require('../jwt/index.js')
const dayjs = require('dayjs')

/** 注册接口 */
exports.register = (req, res) => {
  const regInfo = req.body
  // 判断数据是否为空
  if (!regInfo.account || !regInfo.password) {
    return res.send({
      status: 1,
      msg: '账号或密码不能为空'
    })
  }
  // 判断账号是否存在
  const sqlStr = 'select * from users_table where account = ?'
  db.query(sqlStr, regInfo.account, (err, results) => {
    if (results.length > 0) {
      return res.send({
        status: 1,
        msg: '账号已存在'
      })
    }
    // 账号不存在，可以注册，并使用中间件bcrypt对密码进行加密
    regInfo.password = bcrypt.hashSync(regInfo.password, 10)
    // 插入数据
    const sqlInsert = 'insert into users_table set ?'
    // 身份
    const identity = '用户'
    // 创建时间
    const createAt = dayjs().format('YYYY-MM-DD HH:mm:ss')
    db.query(sqlInsert, {
      account: regInfo.account,
      password: regInfo.password,
      identity,
      createAt,
      // 初始账号状态为0 => 未冻结
      status: 0,
    }, (err, results) => {
      if (err) {
        return res.send({
          status: 1,
          message: '注册失败: ' + err.message
        })
      }
      if (results.affectedRows !== 1) {
        return res.send({
          status: 1,
          message: '注册失败'
        })
      }
      res.send({
        status: 0,
        message: '注册成功'
      })
    })
  })
}


/** 登录接口 */
exports.login = (req, res) => {
  const loginInfo = req.body
  // 查看数据表中有没有前端传过来的账号
  const sqlStr = 'select * from users_table where account = ?'
  db.query(sqlStr, loginInfo.account, (err, results) => {
    // 执行sql语句失败的情况
    if (err) return res.cc(err)
    if (results.length !== 1) return res.cc('登录失败')
    // 对前端传过来的密码进行加密
    const compareResult = bcrypt.compareSync(loginInfo.password, results[0].password)
    if (!compareResult) return res.cc('登录失败')
    // 判断账号是否冻结
    if (results[0].status === 1) return res.cc('账号已冻结')
    // 生成token字符串
    const user = { ...results[0], password: '', avatarUrl: '', createAt: '', updateAt: '' }
    // 设置token的有效期
    const token = jwt.sign(user, jwtconfig.jwtSecretKey, { expiresIn: '10h' })
    res.send({
      status: 0,
      message: '登录成功',
      results: results[0],
      token: 'Bearer ' + token
    })
  })
}
